Redshiftでテーブルのカラム番号・名前・型・桁数を抽出する
データアナリティクス事業本部のueharaです。
今回はAmazon Redshiftでテーブルのカラム番号・名前・型・桁数を抽出するという処理をしてみたいと思います。
方法1
SVV_COLUMNS
を利用して、以下のように書くことができます。
SELECT table_schema AS schema_name, table_name, ordinal_position AS column_number, column_name, data_type, character_maximum_length, numeric_precision, numeric_scale FROM SVV_COLUMNS -- 確認不要なスキーマをフィルタ WHERE table_schema NOT IN ('admin', 'information_schema', 'pg_catalog') ORDER BY schema_name, table_name, column_number
結果は、例えば次のようになります。
schema_name | table_name | column_number | column_name | data_type | character_maximum_length | numeric_precision | numeric_scale |
---|---|---|---|---|---|---|---|
schema_a | table_a | 1 | column_1 | character varying | 16 | [NULL] | [NULL] |
schema_a | table_a | 2 | column_2 | date | [NULL] | [NULL] | [NULL] |
schema_a | table_a | 3 | column_3 | numeric | [NULL] | 32 | 2 |
schema_a | table_b | 1 | column_1 | integer | [NULL] | 32 | 0 |
NUMERIC(precision, scale)
といった、precisionとscaleの桁数をそれぞれカラムを分けて表示したい場合は、こちらを使うと良いと思います。
該当しない項目(例:VARCHAR
におけるnumeric_precision
等)にはNULL
が入ります。
方法2
pg_attribute
, pg_class
, pg_namespace
を利用して、以下のように書くことができます。
SELECT ns.nspname AS schema_name, cls.relname AS table_name, atr.attnum AS column_number, atr.attname AS column_name, pg_catalog.format_type(atr.atttypid, atr.atttypmod) AS data_type FROM pg_attribute atr JOIN pg_class cls ON atr.attrelid = cls.oid JOIN pg_namespace ns ON cls.relnamespace = ns.oid WHERE column_number > 0 AND NOT atr.attisdropped AND -- 確認不要なスキーマをフィルタ schema_name NOT LIKE 'pg_%' AND schema_name NOT IN ('admin', 'information_schema') ORDER BY schema_name, table_name, column_number
結果は、例えば次のようになります。
schema_name | table_name | column_number | column_name | data_type |
---|---|---|---|---|
schema_a | table_a | 1 | column_1 | character varying(16) |
schema_a | table_a | 2 | column_2 | date |
schema_a | table_a | 3 | column_3 | numeric(32,2) |
schema_a | table_b | 1 | column_1 | integer |
データ型と桁数を同じカラム内に表現したい場合は、こちらを使うと良いと思います。
その他の方法
カラムの型・桁を抽出したいテーブルが属するスキーマがsearch_path
に設定されている場合、PG_TABLE_DEF
を利用して次のように書くこともできます。
set_pathについては公式ドキュメントをご確認下さい。
WITH tmp AS ( SELECT table_schema AS schema_name, table_name, ordinal_position AS column_number, column_name FROM SVV_COLUMNS ) SELECT schemaname AS schema_name, tablename AS table_name, column_number, "column" AS column_name, type AS data_type FROM PG_TABLE_DEF ptd JOIN tmp ON ptd.schemaname = tmp.schema_name AND ptd.tablename = tmp.table_name AND ptd."column" = tmp.column_name -- 確認不要なスキーマをフィルタ WHERE schema_name NOT IN ('pg_catalog') ORDER BY schema_name, table_name, column_number
結果は「方法2」の表示結果と同じになります。
schema_name | table_name | column_number | column_name | data_type |
---|---|---|---|---|
schema_a | table_a | 1 | column_1 | character varying(16) |
schema_a | table_a | 2 | column_2 | date |
schema_a | table_a | 3 | column_3 | numeric(32,2) |
schema_a | table_b | 1 | column_1 | integer |
最後に
今回はAmazon Redshiftのテーブルのカラム番号・名前・型・桁数を抽出するを抽出するという処理をしてみました。
参考になりましたら幸いです。